﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Services;
using SISCON.Bl;
using SISCON.Vo;
using SISCON.Common;
using SISCON.Model;

namespace SISCON.Service
{
    [WebService(Namespace = "http://SISCON.mx/")]
    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
    [System.ComponentModel.ToolboxItem(false)]
    [System.Web.Script.Services.ScriptService]
    public class RoleServices : System.Web.Services.WebService
    {
        RoleBL _RoleBL = new RoleBL();

        /// <summary>
        /// Manda a llamar al Bl GetAllRoles
        /// </summary>
        /// <param name="sessionUUID">Sesion del sistema</param>
        /// <param name="roleNameFilter">Filtro para buscar roles por su nombre</param>
        /// <returns></returns>
        [WebMethod]
        [System.Xml.Serialization.XmlInclude(typeof(List<Role>))]
        public ResultObject GetAllRoles(string sessionUUID, string roleNameFilter)
        {
            try
            {
                List<Role> roles = _RoleBL.GetAllRoles(sessionUUID, roleNameFilter);
                return new ResultObject(roles, null);
            }
            catch (Exception ex)
            {
                return new ResultObject(null, ex is SISCONException ? ex.Message : "No fue posible obtener los roles. Favor de intentar más tarde.");
            }
        }

        /// <summary>
        /// Manda a llamar al Bl SaveRole
        /// </summary>
        /// <param name="sessionUUID">Sesion del sistema</param>
        /// <param name="roleId">Id interno del rol</param>
        /// <param name="Name">Nombre del rol</param>
        /// <param name="Permissions">Permisos</param>
        /// <param name="enabled">Indicar si el rol esta activo o no</param>
        /// <returns>Objeto del tipo ResultObject</returns>
        [WebMethod]
        public ResultObject SaveRole(String sessionUUID, String roleId, String Name, String Permissions, bool enabled)
        {
            try
            {
                Role role = new Role();

                if (roleId != null && !roleId.Equals("0"))
                {
                    role.RoleId = Int64.Parse(roleId);
                }

                role.Name = Name;

                Dictionary<string, string> permissionsDictionary = new Dictionary<string, string>();

                string[] permissionsArray = Permissions.Split('|');
                for (int i = 0; i < permissionsArray.Length; i++)
                {
                    string[] accessArray = permissionsArray[i].Split(':');

                    permissionsDictionary.Add(accessArray[0], accessArray[1]);
                }

                if (enabled)
                {
                    role.IsActive = true;
                }
                else
                {
                    role.IsActive = false;
                }

                _RoleBL.SaveRole(sessionUUID, role, permissionsDictionary);
                return new ResultObject("ok", null);
            }
            catch (Exception ex)
            {
                return new ResultObject(null, ex is SISCONException ? ex.Message : "No fue posible guardar el rol. Favor de intentar más tarde.");
            }
        }

        /// <summary>
        /// Manda a llamar al Bl DeleteRole
        /// </summary>
        /// <param name="sessionUUID">Sesion del sistema</param>
        /// <param name="RoleId">Id interno del rol</param>
        /// <returns>Objeto del tipo ResultObject</returns>
        [WebMethod]
        public ResultObject DeleteRole(string sessionUUID, string roleId)
        {
            try
            {
                _RoleBL.DeleteRole(sessionUUID, roleId);
                return new ResultObject("ok", null);
            }
            catch (Exception ex)
            {
                return new ResultObject(null, ex is SISCONException ? ex.Message : "No fue posible borrar el rol. Favor de intentar más tarde.");
            }
        }
    }
}
